//package test;
//
//import java.io.*;
//import java.net.*;
//import java.security.*;
//import java.security.cert.Certificate;
//import java.util.*;
//import java.util.jar.*;
//import java.util.zip.ZipEntry;
//
//import sun.misc.Resource;
//import sun.net.www.ParseUtil;
//import sun.security.action.GetPropertyAction;
//
//// Referenced classes of package sun.misc:
////            Resource, ExtensionDependency, FileURLMapper, InvalidJarIndexException, 
////            JarIndex, JavaUtilJarAccess, MetaIndex, SharedSecrets
//
//public class URLClassPath {
//	private static class FileLoader extends Loader {
//
//		private File dir;
//
//		URL findResource(String s, boolean flag) {
//			Resource resource = getResource(s, flag);
//			if (resource != null)
//				return resource.getURL();
//			else
//				return null;
//		}
//
//		Resource getResource(final String name, boolean flag) {
//			final URL url;
//			final File file;
//			try {
//				URL url1 = new URL(getBaseURL(), ".");
//				url = new URL(getBaseURL(), ParseUtil.encodePath(name, false));
//				if (!url.getFile().startsWith(url1.getFile()))
//					return null;
//			} catch (Exception exception) {
//				return null;
//			}
//			if (flag)
//				URLClassPath.check(url);
//			if (name.indexOf("..") != -1) {
//				file = (new File(dir, name.replace('/', File.separatorChar))).getCanonicalFile();
//				if (!file.getPath().startsWith(dir.getPath()))
//					return null;
//				break MISSING_BLOCK_LABEL_134;
//			}
//			file = new File(dir, name.replace('/', File.separatorChar));
//			if (file.exists())
//				return new Resource() {
//
//					final String val$name;
//					final URL val$url;
//					final File val$file;
//					final FileLoader this$0;
//
//					public String getName() {
//						return name;
//					}
//
//					public URL getURL() {
//						return url;
//					}
//
//					public URL getCodeSourceURL() {
//						return getBaseURL();
//					}
//
//					public InputStream getInputStream() throws IOException {
//						return new FileInputStream(file);
//					}
//
//					public int getContentLength() throws IOException {
//						return (int) file.length();
//					}
//				};
//			return null;
//		}
//
//		FileLoader(URL url) throws IOException {
//			super(url);
//			if (!"file".equals(url.getProtocol())) {
//				throw new IllegalArgumentException("url");
//			} else {
//				String s = url.getFile().replace('/', File.separatorChar);
//				s = ParseUtil.decode(s);
//				dir = (new File(s)).getCanonicalFile();
//				return;
//			}
//		}
//	}
//
//	static class JarLoader extends Loader {
//
//		private JarFile jar;
//		private URL csu;
//		private JarIndex index;
//		private MetaIndex metaIndex;
//		private URLStreamHandler handler;
//		private HashMap lmap;
//
//		JarFile getJarFile() {
//			return jar;
//		}
//
//		private boolean isOptimizable(URL url) {
//			return "file".equals(url.getProtocol());
//		}
//
//		private void ensureOpen() throws IOException {
//			if (jar == null)
//				try {
//					AccessController.doPrivileged(new PrivilegedExceptionAction() {
//
//						final JarLoader this$0;
//
//						public Object run() throws IOException {
//							if (URLClassPath.DEBUG) {
//								System.err.println((new StringBuilder()).append("Opening ").append(csu).toString());
//								Thread.dumpStack();
//							}
//							jar = getJarFile(csu);
//							index = JarIndex.getJarIndex(jar, metaIndex);
//							if (index != null) {
//								String as[] = index.getJarFiles();
//								for (int i = 0; i < as.length; i++)
//									try {
//										URL url = new URL(csu, as[i]);
//										if (!lmap.containsKey(url))
//											lmap.put(url, null);
//									} catch (MalformedURLException malformedurlexception) {
//									}
//
//							}
//							return null;
//						}
//
//						{
//							this$0 = JarLoader.this;
//							super();
//						}
//					});
//				} catch (PrivilegedActionException privilegedactionexception) {
//					throw (IOException) privilegedactionexception.getException();
//				}
//		}
//
//		private JarFile getJarFile(URL url) throws IOException {
//			if (isOptimizable(url)) {
//				FileURLMapper fileurlmapper = new FileURLMapper(url);
//				if (!fileurlmapper.exists())
//					throw new FileNotFoundException(fileurlmapper.getPath());
//				else
//					return new JarFile(fileurlmapper.getPath());
//			} else {
//				URLConnection urlconnection = getBaseURL().openConnection();
//				urlconnection.setRequestProperty("UA-Java-Version", URLClassPath.JAVA_VERSION);
//				return ((JarURLConnection) urlconnection).getJarFile();
//			}
//		}
//
//		JarIndex getIndex() {
//			try {
//				ensureOpen();
//			} catch (IOException ioexception) {
//				throw (InternalError) (new InternalError()).initCause(ioexception);
//			}
//			return index;
//		}
//
//		Resource checkResource(final String name, boolean flag, final JarEntry entry) {
//			final URL url;
//			try {
//				url = new URL(getBaseURL(), ParseUtil.encodePath(name, false));
//				if (flag)
//					URLClassPath.check(url);
//			} catch (MalformedURLException malformedurlexception) {
//				return null;
//			} catch (IOException ioexception) {
//				return null;
//			} catch (AccessControlException accesscontrolexception) {
//				return null;
//			}
//			return new Resource() {
//
//				final String val$name;
//				final URL val$url;
//				final JarEntry val$entry;
//				final JarLoader this$0;
//
//				public String getName() {
//					return name;
//				}
//
//				public URL getURL() {
//					return url;
//				}
//
//				public URL getCodeSourceURL() {
//					return csu;
//				}
//
//				public InputStream getInputStream() throws IOException {
//					return jar.getInputStream(entry);
//				}
//
//				public int getContentLength() {
//					return (int) entry.getSize();
//				}
//
//				public Manifest getManifest() throws IOException {
//					return jar.getManifest();
//				}
//
//				public Certificate[] getCertificates() {
//					return entry.getCertificates();
//				}
//
//				public CodeSigner[] getCodeSigners() {
//					return entry.getCodeSigners();
//				}
//
//				{
//					this$0 = JarLoader.this;
//					name = s;
//					url = url1;
//					entry = jarentry;
//					super();
//				}
//			};
//		}
//
//		boolean validIndex(String s) {
//			String s1 = s;
//			int i;
//			if ((i = s.lastIndexOf("/")) != -1)
//				s1 = s.substring(0, i);
//			for (Enumeration enumeration = jar.entries(); enumeration.hasMoreElements();) {
//				ZipEntry zipentry = (ZipEntry) enumeration.nextElement();
//				String s2 = zipentry.getName();
//				int j;
//				if ((j = s2.lastIndexOf("/")) != -1)
//					s2 = s2.substring(0, j);
//				if (s2.equals(s1))
//					return true;
//			}
//
//			return false;
//		}
//
//		URL findResource(String s, boolean flag) {
//			Resource resource = getResource(s, flag);
//			if (resource != null)
//				return resource.getURL();
//			else
//				return null;
//		}
//
//		Resource getResource(String s, boolean flag) {
//			if (metaIndex != null && !metaIndex.mayContain(s))
//				return null;
//			try {
//				ensureOpen();
//			} catch (IOException ioexception) {
//				throw (InternalError) (new InternalError()).initCause(ioexception);
//			}
//			JarEntry jarentry = jar.getJarEntry(s);
//			if (jarentry != null)
//				return checkResource(s, flag, jarentry);
//			if (index == null) {
//				return null;
//			} else {
//				HashSet hashset = new HashSet();
//				return getResource(s, flag, ((Set) (hashset)));
//			}
//		}
//
//		Resource getResource(String s, boolean flag, Set set) {
//			boolean flag1 = false;
//			int i = 0;
//			LinkedList linkedlist = null;
//			if ((linkedlist = index.get(s)) == null)
//				return null;
//			do {
//				Object aobj[] = linkedlist.toArray();
//				int j = linkedlist.size();
//				do {
//					if (i >= j)
//						break;
//					String s1 = (String) aobj[i++];
//					JarLoader jarloader;
//					final URL url;
//					try {
//						url = new URL(csu, s1);
//						if ((jarloader = (JarLoader) lmap.get(url)) == null) {
//							jarloader = (JarLoader) AccessController.doPrivileged(new PrivilegedExceptionAction() {
//
//								final URL val$url;
//								final JarLoader this$0;
//
//								public Object run() throws IOException {
//									return new JarLoader(url, handler, lmap);
//								}
//
//								{
//									this$0 = JarLoader.this;
//									url = url1;
//									super();
//								}
//							});
//							JarIndex jarindex = jarloader.getIndex();
//							if (jarindex != null) {
//								int k = s1.lastIndexOf("/");
//								jarindex.merge(index, k != -1 ? s1.substring(0, k + 1) : null);
//							}
//							lmap.put(url, jarloader);
//						}
//					} catch (PrivilegedActionException privilegedactionexception) {
//						continue;
//					} catch (MalformedURLException malformedurlexception) {
//						continue;
//					}
//					boolean flag2 = !set.add(url);
//					if (!flag2) {
//						try {
//							jarloader.ensureOpen();
//						} catch (IOException ioexception) {
//							throw (InternalError) (new InternalError()).initCause(ioexception);
//						}
//						JarEntry jarentry = jarloader.jar.getJarEntry(s);
//						if (jarentry != null)
//							return jarloader.checkResource(s, flag, jarentry);
//						if (!jarloader.validIndex(s))
//							throw new InvalidJarIndexException("Invalid index");
//					}
//					Resource resource;
//					if (!flag2 && jarloader != this && jarloader.getIndex() != null
//							&& (resource = jarloader.getResource(s, flag, set)) != null)
//						return resource;
//				} while (true);
//				linkedlist = index.get(s);
//			} while (i < linkedlist.size());
//			return null;
//		}
//
//		URL[] getClassPath() throws IOException {
//			if (index != null)
//				return null;
//			if (metaIndex != null)
//				return null;
//			ensureOpen();
//			parseExtensionsDependencies();
//			if (SharedSecrets.javaUtilJarAccess().jarFileHasClassPathAttribute(jar)) {
//				Manifest manifest = jar.getManifest();
//				if (manifest != null) {
//					Attributes attributes = manifest.getMainAttributes();
//					if (attributes != null) {
//						String s = attributes.getValue(java.util.jar.Attributes.Name.CLASS_PATH);
//						if (s != null)
//							return parseClassPath(csu, s);
//					}
//				}
//			}
//			return null;
//		}
//
//		private void parseExtensionsDependencies() throws IOException {
//			ExtensionDependency.checkExtensionsDependencies(jar);
//		}
//
//		private URL[] parseClassPath(URL url, String s) throws MalformedURLException {
//			StringTokenizer stringtokenizer = new StringTokenizer(s);
//			URL aurl[] = new URL[stringtokenizer.countTokens()];
//			for (int i = 0; stringtokenizer.hasMoreTokens(); i++) {
//				String s1 = stringtokenizer.nextToken();
//				aurl[i] = new URL(url, s1);
//			}
//
//			return aurl;
//		}
//
//		JarLoader(URL url, URLStreamHandler urlstreamhandler, HashMap hashmap) throws IOException {
//			super(new URL("jar", "", -1, (new StringBuilder()).append(url).append("!/").toString(), urlstreamhandler));
//			csu = url;
//			handler = urlstreamhandler;
//			lmap = hashmap;
//			if (!isOptimizable(url)) {
//				ensureOpen();
//			} else {
//				String s = url.getFile();
//				if (s != null) {
//					s = ParseUtil.decode(s);
//					File file = new File(s);
//					metaIndex = MetaIndex.forJar(file);
//					if (metaIndex != null && !file.exists())
//						metaIndex = null;
//				}
//				if (metaIndex == null)
//					ensureOpen();
//			}
//		}
//	}
//
//	private static class Loader {
//
//		private final URL base;
//
//		URL getBaseURL() {
//			return base;
//		}
//
//		URL findResource(String s, boolean flag)
//        {
//            URL url;
//            try
//            {
//                url = new URL(base, ParseUtil.encodePath(s, false));
//            }
//            catch(MalformedURLException malformedurlexception)
//            {
//                throw new IllegalArgumentException("name");
//            }
//            URLConnection urlconnection;
//            if(flag)
//                URLClassPath.check(url);
//            urlconnection = url.openConnection();
//            if(urlconnection instanceof HttpURLConnection)
//            {
//                HttpURLConnection httpurlconnection = (HttpURLConnection)urlconnection;
//                httpurlconnection.setRequestMethod("HEAD");
//                if(httpurlconnection.getResponseCode() >= 400)
//                    return null;
//                break MISSING_BLOCK_LABEL_95;
//            }
//            InputStream inputstream = url.openStream();
//            inputstream.close();
//            return url;
//            Exception exception;
//            exception;
//            return null;
//        }
//
//		Resource getResource(final String name, boolean flag) {
//			final URL url;
//			try {
//				url = new URL(base, ParseUtil.encodePath(name, false));
//			} catch (MalformedURLException malformedurlexception) {
//				throw new IllegalArgumentException("name");
//			}
//			final URLConnection uc;
//			try {
//				if (flag)
//					URLClassPath.check(url);
//				uc = url.openConnection();
//				InputStream inputstream = uc.getInputStream();
//			} catch (Exception exception) {
//				return null;
//			}
//			return new Resource() {
//
//				final String val$name;
//				final URL val$url;
//				final URLConnection val$uc;
//				final Loader this$0;
//
//				public String getName() {
//					return name;
//				}
//
//				public URL getURL() {
//					return url;
//				}
//
//				public URL getCodeSourceURL() {
//					return base;
//				}
//
//				public InputStream getInputStream() throws IOException {
//					return uc.getInputStream();
//				}
//
//				public int getContentLength() throws IOException {
//					return uc.getContentLength();
//				}
//
//				{
//					this$0 = Loader.this;
//					name = s;
//					url = url1;
//					uc = urlconnection;
//					super();
//				}
//			};
//		}
//
//		Resource getResource(String s) {
//			return getResource(s, true);
//		}
//
//		URL[] getClassPath() throws IOException {
//			return null;
//		}
//
//		Loader(URL url) {
//			base = url;
//		}
//	}
//
//	static final String USER_AGENT_JAVA_VERSION = "UA-Java-Version";
//	static final String JAVA_VERSION = (String) AccessController.doPrivileged(new GetPropertyAction("java.version"));
//	private static final boolean DEBUG = AccessController.doPrivileged(new GetPropertyAction(
//			"sun.misc.URLClassPath.debug")) != null;
//	private ArrayList path;
//	Stack urls;
//	ArrayList loaders;
//	HashMap lmap;
//	private URLStreamHandler jarHandler;
//
//	public URLClassPath(URL aurl[], URLStreamHandlerFactory urlstreamhandlerfactory) {
//		path = new ArrayList();
//		urls = new Stack();
//		loaders = new ArrayList();
//		lmap = new HashMap();
//		for (int i = 0; i < aurl.length; i++)
//			path.add(aurl[i]);
//
//		push(aurl);
//		if (urlstreamhandlerfactory != null)
//			jarHandler = urlstreamhandlerfactory.createURLStreamHandler("jar");
//	}
//
//	public URLClassPath(URL aurl[]) {
//		this(aurl, null);
//	}
//
//	public void addURL(URL url)
//    {
//label0:
//        {
//            synchronized(urls)
//            {
//                if(!path.contains(url))
//                    break label0;
//            }
//            return;
//        }
//        urls.add(0, url);
//        path.add(url);
//        stack;
//        JVM INSTR monitorexit ;
//          goto _L1
//        exception;
//        throw exception;
//_L1:
//    }
//
//	public URL[] getURLs()
//    {
//        Stack stack = urls;
//        JVM INSTR monitorenter ;
//        return (URL[])(URL[])path.toArray(new URL[path.size()]);
//        Exception exception;
//        exception;
//        throw exception;
//    }
//
//	public URL findResource(String s, boolean flag) {
//		Loader loader;
//		for (int i = 0; (loader = getLoader(i)) != null; i++) {
//			URL url = loader.findResource(s, flag);
//			if (url != null)
//				return url;
//		}
//
//		return null;
//	}
//
//	public Resource getResource(String s, boolean flag) {
//		if (DEBUG)
//			System.err.println((new StringBuilder()).append("URLClassPath.getResource(\"").append(s).append("\")")
//					.toString());
//		Loader loader;
//		for (int i = 0; (loader = getLoader(i)) != null; i++) {
//			Resource resource = loader.getResource(s, flag);
//			if (resource != null)
//				return resource;
//		}
//
//		return null;
//	}
//
//	public Enumeration findResources(final String name, final boolean check) {
//		return new Enumeration() {
//
//			private int index;
//			private URL url;
//			final String val$name;
//			final boolean val$check;
//			final URLClassPath this$0;
//
//			private boolean next() {
//				if (url != null)
//					return true;
//				Loader loader;
//				while ((loader = getLoader(index++)) != null) {
//					url = loader.findResource(name, check);
//					if (url != null)
//						return true;
//				}
//				return false;
//			}
//
//			public boolean hasMoreElements() {
//				return next();
//			}
//
//			public Object nextElement() {
//				if (!next()) {
//					throw new NoSuchElementException();
//				} else {
//					URL url1 = url;
//					url = null;
//					return url1;
//				}
//			}
//
//			{
//				this$0 = URLClassPath.this;
//				name = s;
//				check = flag;
//				super();
//				index = 0;
//				url = null;
//			}
//		};
//	}
//
//	public Resource getResource(String s) {
//		return getResource(s, true);
//	}
//
//	public Enumeration getResources(final String name, final boolean check) {
//		return new Enumeration() {
//
//			private int index;
//			private Resource res;
//			final String val$name;
//			final boolean val$check;
//			final URLClassPath this$0;
//
//			private boolean next() {
//				if (res != null)
//					return true;
//				Loader loader;
//				while ((loader = getLoader(index++)) != null) {
//					res = loader.getResource(name, check);
//					if (res != null)
//						return true;
//				}
//				return false;
//			}
//
//			public boolean hasMoreElements() {
//				return next();
//			}
//
//			public Object nextElement() {
//				if (!next()) {
//					throw new NoSuchElementException();
//				} else {
//					Resource resource = res;
//					res = null;
//					return resource;
//				}
//			}
//
//			{
//				this$0 = URLClassPath.this;
//				name = s;
//				check = flag;
//				super();
//				index = 0;
//				res = null;
//			}
//		};
//	}
//
//	public Enumeration getResources(String s) {
//		return getResources(s, true);
//	}
//
//	private synchronized Loader getLoader(int i)
//    {
//_L3:
//        if(loaders.size() >= i + 1)
//            break; /* Loop/switch isn't completed */
//        Stack stack = urls;
//        JVM INSTR monitorenter ;
//        if(urls.empty())
//            return null;
//        URL url = (URL)urls.pop();
//        stack;
//        JVM INSTR monitorexit ;
//          goto _L1
//        Exception exception;
//        exception;
//        throw exception;
//_L1:
//        if(lmap.containsKey(url))
//            continue; /* Loop/switch isn't completed */
//        Loader loader;
//        try
//        {
//            loader = getLoader(url);
//            URL aurl[] = loader.getClassPath();
//            if(aurl != null)
//                push(aurl);
//        }
//        catch(IOException ioexception)
//        {
//            continue; /* Loop/switch isn't completed */
//        }
//        loaders.add(loader);
//        lmap.put(url, loader);
//        if(true) goto _L3; else goto _L2
//_L2:
//        return (Loader)loaders.get(i);
//    }
//
//	private Loader getLoader(final URL url) throws IOException {
//		try {
//			return (Loader) AccessController.doPrivileged(new PrivilegedExceptionAction() {
//
//				final URL val$url;
//				final URLClassPath this$0;
//
//				public Object run() throws IOException {
//					String s = url.getFile();
//					if (s != null && s.endsWith("/")) {
//						if ("file".equals(url.getProtocol()))
//							return new FileLoader(url);
//						else
//							return new Loader(url);
//					} else {
//						return new JarLoader(url, jarHandler, lmap);
//					}
//				}
//
//				{
//					this$0 = URLClassPath.this;
//					url = url1;
//					super();
//				}
//			});
//		} catch (PrivilegedActionException privilegedactionexception) {
//			throw (IOException) privilegedactionexception.getException();
//		}
//	}
//
//	private void push(URL aurl[]) {
//		synchronized (urls) {
//			for (int i = aurl.length - 1; i >= 0; i--)
//				urls.push(aurl[i]);
//
//		}
//	}
//
//	public static URL[] pathToURLs(String s) {
//		StringTokenizer stringtokenizer = new StringTokenizer(s, File.pathSeparator);
//		URL aurl[] = new URL[stringtokenizer.countTokens()];
//		int i = 0;
//		while (stringtokenizer.hasMoreTokens()) {
//			File file = new File(stringtokenizer.nextToken());
//			try {
//				file = new File(file.getCanonicalPath());
//			} catch (IOException ioexception) {
//			}
//			try {
//				aurl[i++] = ParseUtil.fileToEncodedURL(file);
//			} catch (IOException ioexception1) {
//			}
//		}
//		if (aurl.length != i) {
//			URL aurl1[] = new URL[i];
//			System.arraycopy(aurl, 0, aurl1, 0, i);
//			aurl = aurl1;
//		}
//		return aurl;
//	}
//
//	public URL checkURL(URL url) {
//		try {
//			check(url);
//		} catch (Exception exception) {
//			return null;
//		}
//		return url;
//	}
//
//	static void check(URL url) throws IOException {
//		SecurityManager securitymanager = System.getSecurityManager();
//		if (securitymanager != null) {
//			URLConnection urlconnection = url.openConnection();
//			Permission permission = urlconnection.getPermission();
//			if (permission != null)
//				try {
//					securitymanager.checkPermission(permission);
//				} catch (SecurityException securityexception) {
//					if ((permission instanceof FilePermission) && permission.getActions().indexOf("read") != -1)
//						securitymanager.checkRead(permission.getName());
//					else if ((permission instanceof SocketPermission)
//							&& permission.getActions().indexOf("connect") != -1) {
//						URL url1 = url;
//						if (urlconnection instanceof JarURLConnection)
//							url1 = ((JarURLConnection) urlconnection).getJarFileURL();
//						securitymanager.checkConnect(url1.getHost(), url1.getPort());
//					} else {
//						throw securityexception;
//					}
//				}
//		}
//	}
//
// }
